package mylab.io.base;

import mylab.io.base.fsm.DasStatus;
import mylab.io.base.model.Msg;
import mylab.io.base.model.Terminal;


public interface DasWatcher<M extends Msg> {

    /**
     * 当das状态变更时
     */
    void onDasStatusChanged(Das<?, ?, M> das, DasStatus status);


    /**
     * 当终端设备连接状态变更时
     * <p>
     * 【关于连接状态】
     * <p>
     * 狭义概念：
     * tcp链路，可以明确连接状态
     * udp链路，实际上没有连接概念的
     * rxtx链路，实际上没有连接概念的
     * <p>
     * 广义概念： 以上层通讯业务能正常请求应答为标准来定义
     * <p>
     * 在此原则基础上，连接状态有一些常用的判定规则：
     * 1、收到消息，立即判定为 true;
     * 2、多次发送请求且未收到应答的，可判定为 false;
     * 3、当本端为伺服端时，指定时间内没有收到终端上报的，可判定为 false;
     */
    void onTerminalConnectionChanged(Das<?, ?, M> das, Terminal terminal, boolean isConnected);


    /**
     * 当das发生异常时
     */
    void onException(Das<?, ?, M> das, Throwable t);


    /**
     * 当das收到消息时
     */
    void onReceived(Das<?, ?, M> das, M msg);
}
